package jmpo.cls;

/**
 * Ниже представлен простой Java класс, который обладает внутренними данными
 * методами и конструктором.
 * Данный класс отмечен, как public, следовательно он является экспортируемым,
 * его можно использовать вне пакета jmpo.cls.
 */
public class SimpleClass {
    /**
     * Перед каждым компонентом класса следует ставить модификатор доступа.
     * Встречаются три модификатора:
     * public - доступен извне класса и пакета всем другим классам;
     * private - недоступен никому вне класса;
     * protected - доступен наследникам в любых пакетах или любым другим классам
     * в том же пакете;
     * отсутствие модификатора называется "модификатором пакета" - 
     * такие компоненты доступны любым классам того же пакета.
     */
    public boolean isPalindrom(long number) {
        if (number < 0) number = -number;
        if (0 == number) return true;
        return number == reverseNumber(number);
    }

    /**
     * Метод ниже является private (закрытой), такой метод может использоваться
     * только другими методами того же класса.
     */
    /**
     * This function reverses the given number.
     * The number must be positive.
     * 
     * @param number a positive integer number
     * @return reversed number
     */
    private long reverseNumber(long number) {
        long reversedNumber = 0;
        do {
            long digit = number % 10;
            reversedNumber *= 10;
            reversedNumber += digit;
        } while ((number /= 10) != 0);
        return reversedNumber;
    }

    /**
     * Данный компонент является элементом внутренних данных объекта.
     * С модификатором public он может быть доступен откуда угодно!
     * Если зануляемая ссылка не инициализирована, то ей присваивается 
     * значение null.
     */
    public String publicName;

    /**
     * Данный компонент является закрытым (private). К нему не имеет доступ никакой метод,
     * кроме методов класса, где он объявлен.
     * Если числовая переменная не инициализирована,
     * то ей присваивается значние 0.
     */
    private long id;

    /**
     * Метод доступа. Возвращает копию внутренних данных.
     */
    public long getId() {
        return id; // если переменная не обнаружена внутри метода,
                   // то она ищется среди внутренних данных объекта (класса)
    }

    /**
     * Метод-мутатор. Позволяет устанавливать внутренние данные.
     */
    public void setId(long id) {
        this.id = id;
        // входящие данные могут "затенять" внутренние данные
        // в этом случае мы можем разрешить пространство имён 
        // с помощью ключевого слова this - ссылки на объект, на котором вызыван метод.
    }

    /**
     * Поименованная константа в классе.
     * Хотя она имеет открытый доступ, но её нельзя установить в другое значение,
     * но можно в любой момент читать из неё значение.
     */
    public final String CONST_NAME = "Some string";

    /**
     * Данный компонент мы будем инициализировать иным образом,
     * без мутаторов.
     */
    private long innerData;

    /**
     * Метод ниже называется КОНСТРУКТОР.
     * Конструктор вызывается ровно один раз при размещении объекта в памяти.
     * Конструктор не возвращает никаких данных.
     * Конструктор позволяет инициализировать данные.
     */
    public SimpleClass(long innerData) {
        this.innerData = innerData; // инициализация
    }

    /**
     * Используем внутренние данные в методе.
     */
    public boolean isInnerDataPalindrom() {
        return this.isPalindrom(innerData);
    }
}